//
//  GDMAccountViewModel.swift
//  SinaWeibo
//
//  Created by mac on 15/11/28.
//  Copyright © 2015年 mac. All rights reserved.
//

import UIKit

import AFNetworking

class GDMAccountViewModel: NSObject {

    
//    让这个界面处理一下业务逻辑
    var userAccount : GDMUserAccount?
    
   override init() {
    
    super.init()

    userAccount = GDMUserAccount.loadAccount()
    
    }
    
    //    判断用户是不是已经登录了，要是可以拿到token就是已经登录了，要是没有就是没有登录
    var userLogin : Bool {
        
//        证明用户已经登录
        return userAccount?.access_token != nil
        
    }
    
    var token : String? {
        
        return userAccount?.access_token
    }
    
//    用户的名字
    var name : String? {
        
        return userAccount?.name
    }
    
    
//    拿到往上获取到的图片
    var headImageURL : NSURL? {
        
        let url = NSURL(string: userAccount?.avatar_large ?? "")
        
        return url
    }
    
    
    //    获取用户的token
//    为了实现在控制器中进行弹框，定义一个闭包把参数传进去，进行一个回调
    func loadAccessToken(code : String , finished : (error : NSError?) -> ()){
        
        //    根据网络的请求获取的到Token
        let tokenStr = "https://api.weibo.com/oauth2/access_token"
        
        //    根据这个地址发送请求
        let manager = AFHTTPSessionManager()
        
        //        添加反序列化的类型
        manager.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        let parameter = ["client_id" : "1726536435" , "client_secret" : "deed402d829ecbb7df7070cbd2879e28" , "grant_type" : "authorization_code" , "code" : code , "redirect_uri" : "http://www.baidu.com"]
        
        //        下滑线的意思表示忽略，这个属性不使用
        manager.POST(tokenStr, parameters: parameter, success: { (_, result) -> Void in
            
            //            可以根据token获取用户一些信息
            //            print(result)
            
            ////            拿到token立即请求用户信息
            //            let token = result["access_token"] as! String
            //
            //            let uid = result["uid"] as! String
            
            //            直接使用对象，调用init的方法传递的是一个字典，把结果转成一个字典
            guard let dict = result as? [String : AnyObject] else {
                
                return
                
            }
            
            let userInfo = GDMUserAccount(dict: dict)
            
            //            这是一个闭包在闭包中使用自己的类和属性的时候一定要使用self
//         MARK   要是在这个方法中进行回调，他会线调用回调的这个，所以就让下一个方法进行真正的回调
            self.loadUserInfo(userInfo, finished: finished)
            
            }) { (_, error) -> Void in
                
                //                print(error)
                finished(error: error)
                
        }
        
    }
    
    //    根据token获取用户信息
    private  func loadUserInfo(userInfo : GDMUserAccount ,finished : (error : NSError?) -> ()) {
        
        let urlString = "https://api.weibo.com/2/users/show.json"
        
        //        为了保险起见，进行判断是否可以获取的到数据
        guard let access_token = userInfo.access_token , uid = userInfo.uid else {
            
//            MARK  现在的弹框是在view中，这样做不是很好，所以去控制器中弹框
            //            网络获取失败
//            SVProgressHUD.showErrorWithStatus("获取网络数据失败,请稍后再试")
            return
        }
        
        let parameter = ["access_token" : access_token , "uid" : uid]
        
        //    根据token发送请求，拿到用户的信息
        let manager = AFHTTPSessionManager()
        
        manager.GET(urlString, parameters: parameter, success: { (_, result) -> Void in
            
            //        得到用户的信息
            //        print(result)
            
            //        在这里获取想要的信息，这个信息少得时候可以使用字典来存放，要是多得时候就要使用一个对象来保存，所以创建一个模型
            //        把要使用的用户的信息存到模型里
            userInfo.avatar_large = result["avatar_large"] as? String
            userInfo.name = result["name"] as? String
            
//            print("123456778",userInfo.avatar_large)
//            print("123456778",userInfo.name)
            
            //        print(userInfo)
            //        进行归档
            userInfo.saveProperty()
            
            finished(error: nil)
            
            //        告诉用户登录成功
//            SVProgressHUD.showSuccessWithStatus("登录成功")
            
            }) { (_, error) -> Void in
                
                //            print(error)
                finished(error: error)
                
        }
        
    }

    
}
